package com.exampleyyy.demoyyy.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.exampleyyy.demoyyy.ServiceJieKou.ShoppingCartServiceJieKou;
import com.exampleyyy.demoyyy.ShiTi.ShoppingCart;
import com.exampleyyy.demoyyy.common.BaseContext;
import com.exampleyyy.demoyyy.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {
    @Autowired
    private ShoppingCartServiceJieKou shoppingCartServiceJieKou;
    /**
     * 添加购物车项
     *
     * @param shoppingCart 购物车项数据，包含菜品或套餐信息
     * @return R<Object> 添加结果的响应，包含状态和数据
     */
    @RequestMapping("/add")
    public R<Object> add(@RequestBody ShoppingCart shoppingCart){
        // 记录接收到的购物车数据
        log.info("购物车数据:{}", shoppingCart);

        // 设置用户id，以确定购物车数据所属的用户
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);

        // 获取购物车项中的菜品id或套餐id
        Long dishId = shoppingCart.getDishId();

        // 构建查询条件，用于查询当前用户是否已将该菜品或套餐添加到购物车
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId, currentId);

        // 根据是否存在菜品id，设置查询条件
        if (dishId != null) {
            // 如果添加到购物车的是菜品，则设置菜品id为查询条件
            queryWrapper.eq(ShoppingCart::getDishId, dishId);
        } else {
            // 如果添加到购物车的是套餐，则设置套餐id为查询条件
            queryWrapper.eq(ShoppingCart::getSetmealId, shoppingCart.getSetmealId());
        }

        // 执行查询，获取购物车中符合条件的菜品或套餐
        ShoppingCart cartServiceOne = shoppingCartServiceJieKou.getOne(queryWrapper);

        // 根据查询结果，处理购物车数据
        if (cartServiceOne != null) {
            // 如果购物车中已存在该菜品或套餐，增加数量
            Integer number = cartServiceOne.getNumber();
            cartServiceOne.setNumber(number + 1);
            shoppingCartServiceJieKou.updateById(cartServiceOne);
        } else {
            // 如果购物车中不存在该菜品或套餐，创建新的购物车项
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartServiceJieKou.save(shoppingCart);
            // 更新cartServiceOne以便后续使用
            cartServiceOne = shoppingCart;
        }
        // 返回添加结果的响应
        return R.success(1, "购物车添加成功", cartServiceOne);
    }
    /**
 * 处理减少购物车商品数量的请求
 *
 * @param shoppingCart 购物车对象，包含用户操作的菜品ID或套餐ID等信息
 * @return 返回操作结果的封装对象R，包含操作状态和提示信息
 */
@PostMapping("/sub")
public R<Object> sub(@RequestBody ShoppingCart shoppingCart){
    // 记录接收到的购物车数据
    log.info("购物车数据:{}", shoppingCart);

    // 获取当前登录用户ID，为购物车对象赋值
    Long currentId = BaseContext.getCurrentId();
    shoppingCart.setUserId(currentId);

    // 根据用户ID和菜品ID/套餐ID，查询购物车中是否已存在该商品
    Long dishId = shoppingCart.getDishId();

    // 创建查询条件对象
    LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(ShoppingCart::getUserId,currentId);

    // 根据是否存在菜品ID或套餐ID设置查询条件
    if(dishId != null){
        queryWrapper.eq(ShoppingCart::getDishId,dishId);
    }else{
        queryWrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
    }
    // 执行查询，获取购物车中的商品数据
    ShoppingCart cartServiceOne =shoppingCartServiceJieKou.getOne(queryWrapper);

    // 如果购物车中已存在该商品，则减少其数量
    if(cartServiceOne != null){
        Integer number = cartServiceOne.getNumber();
        cartServiceOne.setNumber(number - 1);
        // 更新购物车中商品的数量
        shoppingCartServiceJieKou.updateById(cartServiceOne);
    } else {
        // 如果购物车中不存在该商品，则提示减少失败
        return R.error(1,"减少失败",null);
    }
    // 返回减少成功的提示及更新后的购物车商品数据
    return R.success(1,"减少成功",cartServiceOne);
}
    /**
     * 查询并返回当前用户的购物车列表
     *
     * @return 包含购物车列表的响应对象
     */
    @GetMapping("/list")
    public R<Object> list(){
        // 记录查看购物车的日志
        log.info("查看购物车");
        // 创建查询条件封装器
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件，根据用户ID获取购物车项
        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        // 设置排序条件，按照创建时间升序排列购物车项
        queryWrapper.orderByAsc(ShoppingCart::getCreateTime);
        // 执行查询并获取购物车列表
        List<ShoppingCart> list = shoppingCartServiceJieKou.list(queryWrapper);
        // 返回购物车查询结果，包含成功标识、消息和数据列表
        return R.success(1,"购物车查询成功",list);
    }
    /**
     * 清空购物车
     * @return
     */
    @DeleteMapping("/clean")
    public R<Object> clean(){
        // 创建查询条件封装器
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件，根据用户ID删除
        queryWrapper.eq(ShoppingCart::getUserId, BaseContext.getCurrentId());
        // 执行删除操作
        shoppingCartServiceJieKou.remove(queryWrapper);
        // 返回删除结果，包含成功标识和消息
        return R.success(1,"清空购物车成功",null);
    }
}
